home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / misc / amigem.lha / amigem / exec / interrupts.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-22  |  2.9 KB  |  111 lines

  1. #include <exec/execbase.h>
  2. #include <exec/interrupts.h>
  3. #include <exec/tasks.h>
  4. #include <exec/memory.h>
  5. #include <exec/semaphores.h>
  6. #include <exec/devices.h>
  7. #include <exec/io.h>
  8. #include <clib/_exec.h>
  9. #include <amigem/machine.h>
  10.  
  11. #include <amigem/fd_lib.h>
  12. #define LIBBASE struct ExecBase *SysBase
  13.  
  14. #define RaiseInt    Private_4
  15.  
  16. FD2(27,struct Interrupt *,SetIntVector,ULONG intNumber,D0,struct Interrupt *interrupt,A1)
  17. {
  18.   APTR data=NULL;
  19.   void (*code)()=NULL;
  20.   struct Interrupt *ret;
  21.  
  22.   if(interrupt!=NULL)
  23.   { data=interrupt->is_Data;
  24.     code=interrupt->is_Code; }
  25.  
  26.   Disable();
  27.     ret=(struct Interrupt *)SysBase->IntVects[intNumber].iv_Node;
  28.     SysBase->IntVects[intNumber].iv_Data=data;
  29.     SysBase->IntVects[intNumber].iv_Code=code;
  30.     SysBase->IntVects[intNumber].iv_Node=&interrupt->is_Node;
  31.   Enable();
  32.   return ret;
  33. }
  34.  
  35. FC2F(0,bi,LONG,IntServer,A5,APTR is_data,A1,struct ExecBase *SysBase,A6)
  36. ;
  37.  
  38. FC2F(0,b,void,IntHandler,A5,APTR is_data,A1,struct ExecBase *SysBase,A6)
  39. {
  40.   struct Interrupt *i=is_data;
  41.   while(i!=NULL)
  42.   {
  43.     if(IntServer(i->is_Code,i->is_Data,SysBase))
  44.       break;
  45.     i=(struct Interrupt *)i->is_Node.ln_Succ;
  46.   }
  47. }
  48.  
  49. FC2F(0,b,void,SoftIntHandler,A5,APTR is_data,A1,struct ExecBase *SysBase,A6)
  50. {
  51.   int k;
  52.   struct Interrupt *i;
  53.   for(k=0;k<5;k++)
  54.     while((i=(struct Interrupt *)RemHead(&SysBase->SoftInts[k].sh_List))!=NULL)
  55.     { i->is_Node.ln_Type=NT_INTERRUPT;
  56.       IntServer(i->is_Code,i->is_Data,SysBase); }
  57. }
  58.  
  59. FD2(28,void,AddIntServer,long intNum,D0,struct Interrupt *inter,A1)
  60. {
  61.   Disable();
  62.   {
  63.     struct Interrupt *p1,*p2;
  64.     p1=(struct Interrupt *)&SysBase->IntVects[intNum].iv_Node;
  65.     p2=(struct Interrupt *)p1->is_Node.ln_Succ;
  66.     while(p2!=NULL)
  67.     {
  68.       if(p2->is_Node.ln_Pri<inter->is_Node.ln_Pri)
  69.         break;
  70.       p1=p2;
  71.       p2=(struct Interrupt *)p1->is_Node.ln_Succ;
  72.     }
  73.     inter->is_Node.ln_Succ=&p2->is_Node;
  74.     inter->is_Node.ln_Pred=&p1->is_Node;
  75.     p1->is_Node.ln_Succ=&inter->is_Node;
  76.     if(p2!=NULL)
  77.       p2->is_Node.ln_Pred=&inter->is_Node;
  78.     SysBase->IntVects[intNum].iv_Data=SysBase->IntVects[intNum].iv_Node;
  79.     SysBase->IntVects[intNum].iv_Code=&__IntHandler;
  80.   }
  81.   Enable();
  82. }
  83.  
  84. FD2(29,void,RemIntServer,ULONG intNum,D0,struct Interrupt *interrupt,A1)
  85. {
  86.   Disable();
  87.     interrupt->is_Node.ln_Pred->ln_Succ=interrupt->is_Node.ln_Succ;
  88.     if(interrupt->is_Node.ln_Succ!=NULL)
  89.       interrupt->is_Node.ln_Succ->ln_Pred=interrupt->is_Node.ln_Pred;
  90.     if(SysBase->IntVects[intNum].iv_Node==NULL)
  91.       SysBase->IntVects[intNum].iv_Code=NULL;
  92.   Enable();
  93. }
  94.  
  95. FD1(30,void,Cause,struct Interrupt *interrupt,A1)
  96. {
  97.   Disable();
  98.   if(interrupt->is_Node.ln_Type!=NT_SOFTINT)
  99.   {
  100.     interrupt->is_Node.ln_Type=NT_SOFTINT;
  101.     AddTail(&SysBase->SoftInts[interrupt->is_Node.ln_Pri/16+2].sh_List,
  102.             &interrupt->is_Node);
  103.   }
  104.   Enable();
  105.   RaiseInt(INTB_SOFTINT);
  106. }
  107.  
  108. /* Dummy */
  109. FD1(131,ULONG,ObtainQuickVector,APTR interruptCode,A0)
  110. { return 0; }
  111.